<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 要求：如果其原型链上有自定义数据或者方法，认为是非空对象。
	/**
	 * 检查对象是否为空
	 * 该函数用于递归地检查给定的对象是否为空对象，包括其原型链上的对象
	 *
	 * @param {any} obj 待检查的对象
	 * @returns {boolean} 如果对象为空，则返回true；否则返回false
	 */
	function isObjectEmpty(obj){
		// 检查对象是否为null或undefined，如果是，则认为是空对象
		if (obj === null || obj === undefined) return true
		// 检查对象是否为对象类型，如果不是，则返回false
		if (typeof obj !== 'object') return false
		// 检查对象自身是否具有属性，如果有，则返回false
		if (Object.keys(obj).length > 0) return false
		// 获取对象的原型
		let proto = Object.getPrototypeOf(obj)
		// 如果原型存在，递归检查原型对象是否为空
		if (proto){
			return isObjectEmpty(proto)
		}
		// 如果所有检查都通过，最终返回true，表示对象为空
		return true
	}

	// 空对象
	console.log(isObjectEmpty({})); // true

	// 带自有属性的对象
	console.log(isObjectEmpty({a:1})); // false

	// 带原型链属性的对象
	const obj = Object.create({b:2});
	console.log(isObjectEmpty(obj)); // false

	// 非对象类型
	console.log(isObjectEmpty(123)); // false
	console.log(isObjectEmpty(null)); // true

</script>
</html>
